package cn.cj.erp.common.vo.monitor.server;

import cn.cj.erp.common.constants.SystemConstants;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import lombok.Data;

import java.lang.management.ManagementFactory;
import java.util.Date;

/**
 * JVM相关信息
 *
 * @author chenjian
 */
@Data
public class Jvm {
    /**
     * 当前JVM占用的内存总数(M)
     */
    private double total;

    /**
     * JVM最大可用内存总数(M)
     */
    private double max;

    /**
     * JVM空闲内存(M)
     */
    private double free;

    /**
     * JDK版本
     */
    private String version;

    /**
     * JDK路径
     */
    private String home;

    public double getTotal() {
        return NumberUtil.div(total, (1024 * 1024), 2);
    }

    public double getMax() {
        return NumberUtil.div(max, (1024 * 1024), 2);
    }

    public double getFree() {
        return NumberUtil.div(free, (1024 * 1024), 2);
    }

    public double getUsed() {
        return NumberUtil.div(total - free, (1024 * 1024), 2);
    }

    public double getUsage() {
        return NumberUtil.mul(NumberUtil.div(total - free, total, 4), 100);
    }

    /**
     * 获取JDK名称
     */
    public String getName() {
        return ManagementFactory.getRuntimeMXBean().getVmName();
    }

    /**
     * JDK启动时间
     */
    public String getJdkStartTime() {
        return DateUtil.formatDateTime(new Date(ManagementFactory.getRuntimeMXBean().getStartTime()));
    }

    /**
     * JDK运行时间
     */
    public String getRunTime() {

        return timeDistance(new Date(ManagementFactory.getRuntimeMXBean().getStartTime()), new Date());
    }

    /**
     * 运行参数
     */
    public String getInputArgs() {
        return ManagementFactory.getRuntimeMXBean().getInputArguments().toString();
    }

    /**
     * 计算时间差
     *
     * @param end   最后时间
     * @param start 开始时间
     * @return 时间差（天/小时/分钟）
     */
    public String timeDistance(Date start, Date end) {
        // 获得两个时间的毫秒时间差异
        long diff = end.getTime() - start.getTime();
        // 计算差多少天
        long day = diff / SystemConstants.MILLIS_DAY;
        // 计算差多少小时
        long hour = diff % SystemConstants.MILLIS_DAY / SystemConstants.MILLIS_HOUSE;
        // 计算差多少分钟
        long min = diff % SystemConstants.MILLIS_DAY % SystemConstants.MILLIS_HOUSE / SystemConstants.MILLIS_MINUTE;
        // 计算差多少秒//输出结果
        return day + "天" + hour + "小时" + min + "分钟";
    }
}
